package com.exit490.cfp.dao;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.exit490.cfp.helper.DataSourceHelper;
import com.exit490.cfp.modelo.Capital;

public class CapitalDAO {

    public static String TABELA_NOME = "cfp_capital";
    public static String COLUNA_ID = "id_capital";
    public static String COLUNA_NOME = "nome_capital";

    private DataSourceHelper data;
    private ContentValues content = new ContentValues();
    private Cursor cursor = null;
    private SQLiteDatabase sqlLite;
    private long linhasAfetadas;
    private ArrayList<Capital> listaDeCapitais = new ArrayList<Capital>();
    private String[] colunas = new String[] { COLUNA_ID, COLUNA_NOME };

    public CapitalDAO(Context context) {
        data = new DataSourceHelper(context);
        sqlLite = data.getDatabase();
    }

    public boolean existeCapital(Capital capital) {

        String queryNome = null;
        SQLiteDatabase sqlLite = data.getDatabase();
        String where = COLUNA_NOME + "= ?";
        String[] colunas = new String[] { COLUNA_NOME };
        String argumentos[] = new String[] { capital.getNomeDoCapital() };
        this.cursor = sqlLite.query(TABELA_NOME, colunas, where, argumentos, null, null, null);
        if (cursor.getCount() == 1 && cursor.moveToFirst()) {
            queryNome = cursor.getString(cursor.getColumnIndex(COLUNA_NOME));
        }
        if (cursor != null)
            cursor.close();
        return queryNome != null && queryNome.equals(capital.getNomeDoCapital());
    }

    public boolean cadastrarCapital(Capital capital) throws Exception {

        this.content.put(COLUNA_NOME, capital.getNomeDoCapital());
        linhasAfetadas = this.sqlLite.insert(TABELA_NOME, null, content);

        return persistido();
    }

    public boolean removerCapital(Capital capital) {

        String[] args = { String.valueOf(capital.getIdCapital()) };
        linhasAfetadas = this.sqlLite.delete(TABELA_NOME, COLUNA_ID + "=?", args);

        return persistido();
    }

    public boolean atualizarNomeCapital(Capital capital) {

        String[] args = { String.valueOf(capital.getIdCapital()) };
        this.content.put(COLUNA_NOME, capital.getNomeDoCapital());
        linhasAfetadas = this.sqlLite.update(TABELA_NOME, this.content, COLUNA_ID + "=?", args);

        return persistido();
    }

    public String selecionarNomeCapital(long id) {

        String nome = null;
        String[] args = { String.valueOf(id) };
        cursor = sqlLite.query(TABELA_NOME, colunas, COLUNA_ID + "=?", args, null, null, null);

        if (cursor != null & cursor.moveToFirst()) {
            nome = cursor.getString(cursor.getColumnIndex(COLUNA_NOME));
        }
        cursor.close();
        return nome;
    }

    public long selecionarIdCapital(Capital capital) {

        long id = 0;
        String[] args = { capital.getNomeDoCapital() };
        cursor = sqlLite.query(TABELA_NOME, colunas, COLUNA_NOME + "=?", args, null, null, null);

        if (cursor != null & cursor.moveToFirst()) {
            id = cursor.getLong(cursor.getColumnIndex(COLUNA_ID));
        }
        cursor.close();
        return id;
    }

    public ArrayList<Capital> listarTodosCapitais() throws Exception {

        cursor = sqlLite.query(TABELA_NOME, colunas, null, null, null, null, null);

        if (cursor != null & cursor.moveToNext()) {
            do {
                Capital capital = new Capital();
                capital.setIdCapital(cursor.getLong(cursor.getColumnIndex(COLUNA_ID)));
                capital.setNomeDoCapital(cursor.getString(cursor.getColumnIndex(COLUNA_NOME)));
                listaDeCapitais.add(capital);
            } while (cursor.moveToNext());

        }

        if (cursor != null) {
            cursor.close();
        }

        return listaDeCapitais;
    }

    private boolean persistido() {

        if (this.linhasAfetadas > 0) {
            return true;
        } else {
            return false;
        }
    }
}
